#include "io_mgr.h"
#include "io_api.h"
#include "common_api.h"
#include "time_mgr.h"
#include "iic.h"

static void common_gpio_init(void)
{
    //power led io config,all leds shut off
    PIO_out_config_api(PWR_LED_4_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE, PWR_LED_4);
    TURN_LED_OFF(PWR_LED_4_PIO, PWR_LED_4);
    PIO_out_config_api(PWR_LED_3_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE, PWR_LED_3);
    TURN_LED_OFF(PWR_LED_3_PIO, PWR_LED_3);
    PIO_out_config_api(PWR_LED_2_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE, PWR_LED_2);
    TURN_LED_OFF(PWR_LED_2_PIO, PWR_LED_2);
    PIO_out_config_api(PWR_LED_1_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE, PWR_LED_1);
    TURN_LED_OFF(PWR_LED_1_PIO, PWR_LED_1);
    
    //PA0 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA0_IDX);
    //PA1 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA1_IDX);
    //PA2, PA3 for hub d+/d- adc
    //PA4 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA4_IDX);
    //PA5 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA5_IDX);
    //PA6 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA6_IDX);
    //PA7 charge-switch detect, in
    PIO_input_config_api(CHGE_SWITCH_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE, CHGE_SWITCH_PIO_IDX);
    //PA8 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA8_IDX);
    //PA9 not used
    PIO_input_config_api(PIOA, PULL_UP_ENABLE, FILTER_DISABLE, PIO_PA9_IDX);
    //PA10 not used
    PIO_input_config_api(PIOA,ENABLE,DISABLE,10);
    //PA11 hub-connect detect, in, pull-up
    PIO_input_config_api(HUB_CNCT_PIO, 1, 0, HUB_CNCT_PIO_IDX);
    //PA12 for mfi-iic
    //PA13 not used
    PIO_input_config_api(PIOA,ENABLE,DISABLE,13);
    //PA15 not used
    PIO_input_config_api(PIOA,ENABLE,DISABLE,15);
    //PA16 VIN_OVP adc
    //PA17, PA18 for pmu-iic
    //PA19, PA20, PA21, PA22, PA23, PA24 for sdio
    //PA25 not used
    PIO_input_config_api(PIOA,ENABLE,DISABLE,25);
    
    
    //pA26 SD card power control
    PIO_out_config_api(SD_ENABLE_PIO, 0, 0, SD_ENABLE_PIO_IDX);
    PIO_set_bit(SD_ENABLE_PIO, SD_ENABLE_PIO_IDX);
    
    //HSMCI_pin_config();
    //PA24 input pull-up disable
    /*PIO_input_config_api(SD_D3_PIO,DISABLE,DISABLE,SD_D3_PIO_IDX);
    //PA23 input pull-up disable
    PIO_input_config_api(SD_D2_PIO,DISABLE,DISABLE,SD_D2_PIO_IDX);
    //PA22 input pull-up disable
    PIO_input_config_api(SD_D1_PIO,DISABLE,DISABLE,SD_D1_PIO_IDX);
    //PA21 input pull-up disable
    PIO_input_config_api(SD_D0_PIO,DISABLE,DISABLE,SD_D0_PIO_IDX);
    //PA20 input pull-up disable
    PIO_input_config_api(SD_CMD_PIO,DISABLE,DISABLE,SD_CMD_PIO_IDX);
    //PA19 input pull-up disable
    PIO_input_config_api(SD_CLK_PIO,DISABLE,DISABLE,SD_CLK_PIO_IDX);*/
    
    
    //PA27 usb-switch ctrl, out
    PIO_out_config_api(USB_SWITCH_PIO, 0, 0, USB_SWITCH_PIO_IDX);
    //PIO_reset_bit(USB_SWITCH_PIO, USB_SWITCH_PIO_IDX);
    PIO_set_bit(USB_SWITCH_PIO, USB_SWITCH_PIO_IDX);  //for PVT
    //PA28 push_button detect, in
    PIO_input_config_api(PUSH_BUTTON_PIO, 0, 0, PUSH_BUTTON_PIO_IDX);
    //PA29 not used,config as input pull-up enable
    PIO_input_config_api(PIOA,ENABLE,DISABLE,29);
    //PA30 not avaliable in sam3a4c,config as input pull-up enable 
    PIO_input_config_api(PIOA,ENABLE,DISABLE,30);
    //PA31 not avaliable in sam3a4c,config as input pull-up enable
    PIO_input_config_api(PIOA,ENABLE,DISABLE,31);
    
    //PB0-PB6 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,0);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,1);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,2);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,3);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,4);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,5);
    PIO_input_config_api(PIOB,ENABLE,DISABLE,6);
    //PB7 hub disable ctrl, out
    PIO_out_config_api(HUB_SWITCH_PIO, 0, 0, HUB_SWITCH_PIO_IDX);
    PIO_set_bit(HUB_SWITCH_PIO, HUB_SWITCH_PIO_IDX);
    //PB8 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,8);
    //PB9 battery-power led4, out
//    PIO_out_config_api(PWR_LED_4_PIO, 0, 0, PWR_LED_4);
//    PIO_reset_bit(PWR_LED_4_PIO, PWR_LED_4);
    //PB10 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,10);
    //PB11 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,11);
    //PB12 battery voltage samp,adc
    //PB13 battery-power adc enable ctrl, out
    PIO_out_config_api(BP_ADC_ENABLE_PIO, 0, 0, BP_ADC_ENABLE_PIO_IDX);
    PIO_set_bit(BP_ADC_ENABLE_PIO, BP_ADC_ENABLE_PIO_IDX);
    //PB14 battery-power led3, out
//    PIO_out_config_api(PWR_LED_3_PIO, 0, 0, PWR_LED_3);
//    PIO_reset_bit(PWR_LED_3_PIO, PWR_LED_3);
    //PB15 burn_in trigger,in
    PIO_input_config_api(BURN_IN_TRIGGER_PIO, 1, 0, BURN_IN_TRIGGER_PIO_IDX);
    //PB16 burn_in enable,out
    PIO_out_config_api(BURN_IN_ENABLE_PIO, 0, 0, BURN_IN_ENABLE_PIO_IDX);
    PIO_reset_bit(BURN_IN_ENABLE_PIO, BURN_IN_ENABLE_PIO_IDX);
    //PB17 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,17);
    //PB18 load current samp,adc
    //PB19 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,19);
    //PB20 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,20);
    //PB21 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,21);
    //PB22 battery-power led2, out 
//    PIO_out_config_api(PWR_LED_2_PIO, 0, 0, PWR_LED_2);
//    PIO_reset_bit(PWR_LED_2_PIO, PWR_LED_2);
    //PB23 for mfi-iic
    //PB24 
//    PIO_out_config_api(PWR_LED_1_PIO, 0, 0, PWR_LED_1);
//    PIO_reset_bit(PWR_LED_1_PIO, PWR_LED_1);
    //PB25 not used
    PIO_input_config_api(PIOB,ENABLE,DISABLE,25);
    //PA12 PA14 PB23 PB26 auth chip io config
    auth_chip_io_power_on();
    //PB27 device-power enable ctrl, out
    PIO_out_config_api(DP_ENABLE_PIO, 0, 0, DP_ENABLE_PIO_IDX);
    PIO_reset_bit(DP_ENABLE_PIO, DP_ENABLE_PIO_IDX);
    //PB28-PB31 used as JTAG debug pins
}

void HSMCI_pin_config(void)
{
        PIOA->PIO_IDR |= 0x3F<<19;
        PIOA->PIO_ABSR &= ~(0x3F<<19);
        PIOA->PIO_PDR |= 0x3F<<19;
        PIOA->PIO_PUDR |= 0x3F<<19;
        
	    /*PIOD->PIO_IDR |= 0x0F<<0;
        PIOD->PIO_ABSR |= 0x0F<<0;
        PIOD->PIO_PDR |= 0x0F<<0;
        PIOD->PIO_PUDR |= 0x0F<<0;*/

        //card detect pin config
        /*PIOE->PIO_IDR |= 1U<<6;
        PIOE->PIO_PUER |= 1U<<6;
        PIOE->PIO_IFDR |= 1U<<6;
        PIOE->PIO_ODR |= 1U<<6;
        PIOE->PIO_PER |= 1U<<6;*/       
}

void io_init(void)
{
    //common gpio
    common_gpio_init();
    
    
    
    //wait 1000ms after power on sd card,before config sd io 
    //sys_tick_delay_us(50000);
  
    //for peripheral gpio,sd pin config must call after common_gpio_init()
    //HSMCI_pin_config();    
}

void led_set_status(uint8_t idx, bool led_state)
{ 
    switch(idx)
    {
    case LED_1:
      if(led_state == LED_ON)
      {
          TURN_LED_ON(PWR_LED_1_PIO, PWR_LED_1);
      }
      else
      {
          TURN_LED_OFF(PWR_LED_1_PIO, PWR_LED_1);
      }
      break;
     
     case LED_2:
      if(led_state == LED_ON)
      {
          TURN_LED_ON(PWR_LED_2_PIO, PWR_LED_2);
      }
      else
      {
          TURN_LED_OFF(PWR_LED_2_PIO, PWR_LED_2);
      }
      break;
     
     case LED_3:
      if(led_state == LED_ON)
      {
          TURN_LED_ON(PWR_LED_3_PIO, PWR_LED_3);
      }
      else
      {
          TURN_LED_OFF(PWR_LED_3_PIO, PWR_LED_3);
      }
      break;
     
     case LED_4:
      if(led_state == LED_ON)
      {
          TURN_LED_ON(PWR_LED_4_PIO, PWR_LED_4);
      }
      else
      {
          TURN_LED_OFF(PWR_LED_4_PIO, PWR_LED_4);
      }
      break;
     
    default:
      break;
    }
}

//cut off power to iPhone
/*void disable_vout_en(void)
{
    PIO_reset_bit(DP_ENABLE_PIO, DP_ENABLE_PIO_IDX);
}*/

//turn on power to iPhone
/*void enable_vout_en(void)
{
    PIO_set_bit(DP_ENABLE_PIO, DP_ENABLE_PIO_IDX);
}*/

void sdio_power_down(void)
{    
    //PA24 input pull-up disable
    PIO_input_config_api(SD_D3_PIO,DISABLE,DISABLE,SD_D3_PIO_IDX);
    //PIO_reset_bit(SD_D3_PIO, SD_D3_PIO_IDX);
    //PA23 input pull-up disable
    PIO_input_config_api(SD_D2_PIO,DISABLE,DISABLE,SD_D2_PIO_IDX);
    //PIO_reset_bit(SD_D2_PIO, SD_D2_PIO_IDX);
    //PA22 input pull-up disable
    PIO_input_config_api(SD_D1_PIO,DISABLE,DISABLE,SD_D1_PIO_IDX);
    //PIO_reset_bit(SD_D1_PIO, SD_D1_PIO_IDX);
    //PA21 input pull-up disable
    PIO_input_config_api(SD_D0_PIO,DISABLE,DISABLE,SD_D0_PIO_IDX);
    //PIO_reset_bit(SD_D0_PIO, SD_D0_PIO_IDX);
    //PA20 input pull-up disable
    PIO_input_config_api(SD_CMD_PIO,DISABLE,DISABLE,SD_CMD_PIO_IDX);
    //PIO_reset_bit(SD_CMD_PIO, SD_CMD_PIO_IDX);
    //PA19 input pull-up disable
    PIO_input_config_api(SD_CLK_PIO,DISABLE,DISABLE,SD_CLK_PIO_IDX);
    //PIO_reset_bit(SD_CLK_PIO, SD_CLK_PIO_IDX);      
    
    //PA26 output high level
    PIO_set_bit(SD_ENABLE_PIO, SD_ENABLE_PIO_IDX);
}

void auth_chip_io_power_on(void)
{
    //PB26 MFI chip power control
    PIO_out_config_api(AUTH_CHIP_POWER_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE,\
                       AUTH_CHIP_POWER_PIO_IDX);
    PIO_set_bit(AUTH_CHIP_POWER_PIO, AUTH_CHIP_POWER_PIO_IDX);
    //PA14 MFI authentification-IC reset ctrl, out
    PIO_out_config_api(MFI_RESET_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE,\
                       MFI_RESET_PIO_IDX);
    PIO_set_bit(MFI_RESET_PIO, MFI_RESET_PIO_IDX);
    //PA12 SCL
    PIO_out_config_api(IIC_SCL_PORT, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE,\
                       IIC_SCL_PIN_NUM);
    PIO_set_bit(IIC_SCL_PORT, IIC_SCL_PIN_NUM);
    //PB23 SDA
    PIO_out_config_api(IIC_SDA_PORT, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE,\
                       IIC_SDA_PIN_NUM);
    PIO_set_bit(IIC_SDA_PORT, IIC_SDA_PIN_NUM);
}

void auth_chip_io_power_down(void)
{
    //PA14 MFI authentification-IC reset ctrl, out
    PIO_input_config_api(MFI_RESET_PIO, PULL_UP_DISABLE, FILTER_DISABLE,\
                       MFI_RESET_PIO_IDX);
    //PA12 SCL
    PIO_input_config_api(IIC_SCL_PORT, PULL_UP_DISABLE, FILTER_DISABLE,\
                       IIC_SCL_PIN_NUM);
    //PB23 SDA
    PIO_input_config_api(IIC_SDA_PORT, PULL_UP_DISABLE, FILTER_DISABLE,\
                       IIC_SDA_PIN_NUM);
    //PB26 MFI chip power control
    PIO_out_config_api(AUTH_CHIP_POWER_PIO, PULL_UP_DISABLE, MULTI_DRIVE_DISABLE,\
                       AUTH_CHIP_POWER_PIO_IDX);
    PIO_reset_bit(AUTH_CHIP_POWER_PIO, AUTH_CHIP_POWER_PIO_IDX);
}
